<?php
// 应用公共文件
use app\Exception\DbException;
use think\facade\Db;
use think\response\Json;


/**
 * 返回成功json
 * @param mixed $data 返回数据
 * @param string $msg 返回信息
 * @param int $code 返回code
 * @return Json
 */
function successJson($data = true, string $msg = 'success', int $code = 200) {
    $re = [
        'code'=> $code,
        'msg'=> $msg,
        'data' => $data,
    ];
    return json($re);
}

/**
 * 返回erros_json
 * @param string $msg 返回信息
 * @param int $errorCode 返回code
 * @return Json
 */
function errorJson(int $errorCode, string $msg = 'unSuccess') {
    $re = [
        'code'=> $errorCode,
        'msg'=> $msg,
    ];
    return json($re);
}

/**
 * 获取现在的时间： 2021-01-01 00:00:00
 * @return false|string
 */
function getDateTime() {
    return date('Y-m-d H:i:s', time());
}

/**
 * DB事务封装
 * @param callable $fun 执行数据库操作
 * @param callable|null $errorCallBack 发生错误的回调
 * @return bool
 */
function dbTrans(callable $fun, callable $errorCallBack=null):bool {
    Db::startTrans();
    try {
        $fun();
        Db::commit();
        return true;
    }catch (\Exception $e) {
        // 回滚事务
        Db::rollback();
        if($errorCallBack!==null) $errorCallBack();
        throw new DbException($e->getMessage());
    }
}

/**
 * 获取当前服务器的IP
 * @return array|false|mixed|string
 */
function get_client_ip(){
    if ($_SERVER['REMOTE_ADDR']) {
        $cip = $_SERVER['REMOTE_ADDR'];
    } elseif (getenv("REMOTE_ADDR")) {
        $cip = getenv("REMOTE_ADDR");
    } elseif (getenv("HTTP_CLIENT_IP")) {
        $cip = getenv("HTTP_CLIENT_IP");
    } else {
        $cip = "unknown";
    }
    return $cip;
}

/**
 * 生成连续相同的字符串
 * @param int $len
 * @param string $sign
 * @return string
 */
function buildSameStr(int $len, string $sign = '*') {
    $str = "";
    for ($i = 0; $i < $len; $i ++) {
        $str .= $sign;
    }
    return $str;
}

/**
 * 放回一个空的分页
 * @return array
 */
function nullDataPaginateArr() {
    return [
        'total' => 0,
        'per_page' => 0,
        'current_page' => 0,
        'last_page' => 0,
        'lists' => []
    ];
}